package controle;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JPanel;

import negocio.Cenario;
import negocio.Inimigo;
import negocio.Jogador;
import negocio.Tiro;

/**
 * Classe que representa uma fase do jogo, com o cenário, os inimigos e o
 * comportamento. Essa é a classe responsável por instancializar os inimigos,
 * colocá-los nos hotspots, controlar os eventos (como disparar um tiro) e
 * pintar o cenário e os inimigos na tela.
 * <p>
 * Essa é uma classe crítica, grande parte das responsabilidades do jogo estão
 * concentradas aqui.
 */
public abstract class Fase extends JPanel {

	private Cenario cenario;

	/**
	 * A lista de inimigos é <code>protected</code> para facilitar seu manuseio
	 * pelas classes filhas.
	 */
	protected List<Inimigo> inimigos = new ArrayList<Inimigo>();

	/**
	 * Construtor que deve ser chamado pelas classes filhas, pois uma parte
	 * essencial da programação do jogo está aqui. Como esta é uma classe
	 * abstrata, esse construtor não existe para instancializar objetos
	 * diretamente, mas para livrar as classes filhas (as fases de verdade) de
	 * implementarem o tratamento de eventos (uma parte crítica).
	 * 
	 * @param cenario
	 *            o cenário da fase, já instancializado
	 */
	public Fase(Cenario cenario) {
		this.cenario = cenario;
		this.setPreferredSize(new Dimension(cenario.getImage().getWidth(), cenario.getImage().getHeight()));
		this.addMouseListener(new MouseAdapter() {

			@Override
			public void mouseClicked(MouseEvent e) {
				Jogador.getInstance().atira();
				Tiro bala = new Tiro(e.getX(), e.getY());
				boolean acertou = false;
				Object atingido = null;
				for (Inimigo i : inimigos) {
					if (i.isAtingido(bala)) {
						i.morre();
						acertou = true;
						atingido = i;
						break;
					}
				}
				if (acertou) {
					inimigos.remove(atingido);
				}
			}

		});
	}

	@Override
	protected void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D) g.create();
		g2.drawImage(cenario.getImage(), 0, 0, null);
		for (Inimigo i : inimigos) {
			g2.drawImage(i.getImage(), i.getX(), i.getY(), null);
		}
		g2.dispose();
	}

}
